﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using TumbaloSoft.Models;
using System.Collections;
using TumbaloSoft.Helpers;
using TumbaloSoft.Helpers.QueryObjects;
using iTextSharp.text;

namespace TumbaloSoft.Controllers
{
    public class AdministradorController : TumbaloController
    {
        private static Object lockObject = new Object();

        public ActionResult Index(BusquedaAdministrador administradorBuscar)
        {
            if (defaultAction != null) return defaultAction;
            int numActivos = 0;
            try
            {
                numActivos = HelperAdministrador.selectCountActivos();
                ViewBag.ListaAdministradores = HelperAdministrador.buscar(administradorBuscar);
            }
            catch (Exception ex)
            {
                Logger.Current.Error("Error al intentar cargar la pagina", ex);
                return View("~/Views/Shared/Error.cshtml");
            }

            ViewBag.prevPage = administradorBuscar.prPage - 1;
            ViewBag.nextPage = administradorBuscar.prPage + 1;
            ViewBag.numPages = numActivos / administradorBuscar.prPageSize;
            if ((numActivos % administradorBuscar.prPageSize) > 0) ViewBag.numPages++;

            return View(administradorBuscar);
        }

        public ActionResult Registrar()
        {
            if (defaultAction != null) return defaultAction;
            try
            {
                ViewBag.listaTipo = HelperTipoDocumento.selectAll();
            }
            catch (Exception ex)
            {
                Logger.Current.Error("Error al intentar registrar al administrador", ex);
                return View("~/Views/Shared/Error.cshtml");
            }
            return View();
        }

        [HttpPost]
        public ActionResult Registrar(AdministradorEdificios administrador)
        {
            if (defaultAction != null) return defaultAction;
            try
            {   //Llamar a todas las listas que se utilizan
                //ViewBag.codigo = HelperAdministrador.SiguienteCodigo();
                ViewBag.listaTipo = HelperTipoDocumento.selectAll();
                administrador.prTipoEmpleadoTumbalo = new TipoEmpleadoTumbalo();
                administrador.prTipoEmpleadoTumbalo.prIdTipoEmpleado = 2; //ADMINISTRADOR

                Boolean existe = HelperAdministrador.ExisteAdministrador(administrador.prCodigoDocumento);
                Boolean esMayor = EsMayorEdad(administrador.prFechaNacimiento);
                administrador.prEstado = "ACTIVO";

                if (existe == true)
                {
                    ModelState.AddModelError("prCodigoDocumento", "Ya existe la persona");
                    return View(administrador);
                }
                if (esMayor == false)
                {
                    ModelState.AddModelError("prFechaNacimiento", "La persona debe de ser mayor de edad");
                    return View(administrador);
                }
                else if (ModelState.IsValid)
                {

                    lock (lockObject)
                    {
                        administrador.prIdPersona = (int)(HelperPersonaNatural.SiguienteCodigo());
                        administrador.prIdAdministrador = (int)(HelperAdministrador.SiguienteCodigo()); //<!--codigo decimal empleado-->       
                        administrador.prEstado = "ACTIVO";
                        HelperAdministrador.insert(administrador);
                        AccountController.crearCuenta((PersonaNatural)administrador, 2);
                        //return RedirectToAction("Index");
                    }

                    ViewBag.mensaje = "Se registro correctamente al Administrador " + administrador.prNombre + " " + administrador.prApellidoPaterno;
                    ViewBag.returnURL = "/Administrador/Index";
                    return View("~/Views/Shared/Exito.cshtml");
                }
                else return View(administrador);
            }
            catch (Exception ex)
            {
                Logger.Current.Error("Error al intentar registrar al administrador", ex);
                return View("~/Views/Shared/Error.cshtml");
            }
        }

        public ActionResult Modificar(int? prIdAdministrador)
        {
            if (defaultAction != null) return defaultAction;
            if (!prIdAdministrador.HasValue)
            {
                return View("~/Views/Shared/Error.cshtml");
            }
            else
            {
                try
                {
                    ViewBag.listaTipo = HelperTipoDocumento.selectAll();
                    AdministradorEdificios administrador = HelperAdministrador.selectById(prIdAdministrador.Value);
                    administrador.prIdEdificio = HelperAdministrador.EdificioAdministradoSelect(administrador.prIdAdministrador);
                    if (HelperAdministrador.EdificioAdministradoSelect(administrador.prIdAdministrador) != 0)
                        administrador.prIdEdificio = HelperAdministrador.EdificioAdministradoSelect(administrador.prIdAdministrador);


                    ViewBag.listaEdificios = HelperEdificio.selectAdministrables(administrador.prIdAdministrador);
                    if (administrador == null) return View();//si el vendedor no se encontro  
                    else return View(administrador);
                }
                catch (Exception ex)
                {
                    Logger.Current.Error("Error al intentar modificar al administrador", ex);
                    return View("~/Views/Shared/Error.cshtml");
                }
            }
        }

        [HttpPost]
        public ActionResult Modificar(AdministradorEdificios administrador)
        {
            if (defaultAction != null) return defaultAction;
            try
            { 
                ViewBag.listaTipo = HelperTipoDocumento.selectAll();
                Boolean esMayor = EsMayorEdad(administrador.prFechaNacimiento);
                if (esMayor == false)
                {
                    ModelState.AddModelError("prFechaNacimiento", "La persona debe de ser mayor de edad");
                    return View(administrador);
                }

                else
                {

                    //ModelState.Remove("prEdificio.prIdEdificio");
                    if (ModelState.IsValid)
                    {
                        ViewBag.listaTipo = HelperTipoDocumento.selectAll();
                        ViewBag.listaDistrito = HelperDistrito.selectAll();
                        int idPersona = HelperAdministrador.IdPersona(administrador.prIdAdministrador);
                        administrador.prIdPersona = idPersona;
                        administrador.prEstado = "ACTIVO";
                        HelperAdministrador.update(administrador);

                        HelperAdministrador.updateEdificioAdministrado(administrador);

                        ViewBag.mensaje = "Se modifico correctamente al Administrador " + administrador.prNombre + " " + administrador.prApellidoPaterno;
                        ViewBag.returnURL = "/Administrador/Index";
                        return View("~/Views/Shared/Exito.cshtml");
                    }
                }

            }
            catch (Exception ex)
            {
                Logger.Current.Error("Error al intentar modificar al administrador", ex);
                return View("~/Views/Shared/Error.cshtml");
            } 
            return View(administrador);
        }

        public ActionResult Eliminar(int? prIdAdministrador, BusquedaAdministrador administradorBuscar)
        {
            if (defaultAction != null) return defaultAction;
            if (!prIdAdministrador.HasValue)
            {
                return View("~/Views/Shared/Error.cshtml");
            }
            else
            {
                try
                {
                    ViewBag.listaTipo = HelperTipoDocumento.selectAll();
                    ViewBag.listaDistrito = HelperDistrito.selectAll();
                    ViewBag.ListaAdministrador = HelperAdministrador.buscar(administradorBuscar);
                    AdministradorEdificios administrador = HelperAdministrador.selectById(prIdAdministrador.Value);
                    if (administrador == null) return View();//si el Administrador no se encontro
                    else return View(administrador);
                }
                catch (Exception ex)
                {
                    Logger.Current.Error("Error al intentar eliminar al administrador", ex);
                    return View("~/Views/Shared/Error.cshtml");
                }
            }
        }

        [HttpPost]
        public ActionResult Eliminar(AdministradorEdificios administrador, BusquedaAdministrador administradorBuscar)
        {
            if (defaultAction != null) return defaultAction;
            try
            {
                ViewBag.listaTipo = HelperTipoDocumento.selectAll();
                ViewBag.ListaAdministrador = HelperAdministrador.buscar(administradorBuscar);
                HelperAdministrador.delete(administrador);
                ViewBag.mensaje = "Se elimino correctamente al administrador " + administrador.prNombre + " " + administrador.prApellidoPaterno;
                ViewBag.returnURL = "/Administrador/Index";
                return View("~/Views/Shared/Exito.cshtml");
            }
            catch (Exception ex)
            {
                Logger.Current.Error("Error al intentar eliminar al administrador", ex);
                return View("~/Views/Shared/Error.cshtml");
            }
        }



        public Boolean EsMayorEdad(DateTime fechaNacimiento)
        {
            
            try
            {
                int edad = DateTime.Today.Year - fechaNacimiento.Year;
                if (new DateTime(DateTime.Today.Year, fechaNacimiento.Month, fechaNacimiento.Day) > DateTime.Today) edad--;
                if (edad > 18 && edad < 65) return true;
                else return false;
            }
            catch (Exception ex)
            {
                Logger.Current.Error("Error al intentar eliminar al administrador", ex);
                return false;
            }
        }
        public ActionResult AgregarEdificioAdministrar(BusquedaEdificio edificioBuscar, int? prIdAdministrador)
        {
            if (defaultAction != null) return defaultAction;

            //if (!AccountController.validarLogueo(HttpContext))
            //return RedirectToAction("LogOn", "Account", new { returnUrl = HttpContext.Request.Path });
            int numActivos = 0;
            try//dentro del try va todo lo que tenga que ver con los helpers que es lo que puede producir la exception
            {
                ViewBag.idAdministrador = prIdAdministrador;
                ViewBag.lista = HelperDistrito.selectAll();
                numActivos = HelperEdificio.selectCountActivos();
                ViewBag.ListaEdificios = HelperEdificio.buscar(edificioBuscar);
            }
            catch (Exception ex)
            {
                Logger.Current.Error("Error al intentar agregar un edificio para administrar", ex);
                return View("~/Views/Shared/Error.cshtml");
            }
            ViewBag.prevPage = edificioBuscar.prPage - 1;
            ViewBag.nextPage = edificioBuscar.prPage + 1;
            ViewBag.numPages = numActivos / edificioBuscar.prPageSize;
            if ((numActivos % edificioBuscar.prPageSize) > 0) ViewBag.numPages++;

            return View(edificioBuscar);
        }
    }
}
